package br.cefet.farmaciaonline.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.cefet.farmaciaonline.connection.ConnectionFactory;
import br.cefet.farmaciaonline.vo.Paciente;
import br.cefet.farmaciaonline.vo.Usuario;

public class UsuarioDAO {
	Connection con = null;
	PreparedStatement ptmt = null;
	ResultSet rs = null;
	private static UsuarioDAO usuarioDao;

	/*
	 * public EmployeeJdbcDAO() {
	 * 
	 * }
	 */

	private Connection getConnection() throws SQLException {
		Connection conn;
		conn = ConnectionFactory.getInstance().getConnection();
		return conn;
	}

	public static UsuarioDAO getInstance() {

		if (usuarioDao == null) {
			usuarioDao = new UsuarioDAO();
		}

		return usuarioDao;

	}

	public Usuario getUsuarioById(int id) {
		Usuario usuario = null;
		try {
			String querystring = "SELECT * FROM usuario WHERE userid=?";
			con = getConnection();
			ptmt = con.prepareStatement(querystring);
			ptmt.setInt(1, id);
			rs = ptmt.executeQuery();
			if (rs.next()) {
				usuario = new Usuario();
				usuario.setLogin(rs.getString(1));
				usuario.setPassword(rs.getString(2));
				usuario.setUserid(rs.getInt(3));
				usuario.setNome(rs.getString(4));
				usuario.setEmail(rs.getString(5));
				usuario.setTelefone(rs.getString(6));
				usuario.setTipo(rs.getString(7));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (ptmt != null)
					ptmt.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return usuario;
	}

	public Usuario logarUsuario(String username, String password) {
		Usuario usuario = null;
		try {
			String querystring = "SELECT * FROM usuario WHERE username=? and password=?";
			con = getConnection();
			ptmt = con.prepareStatement(querystring);
			ptmt.setString(1, username);
			ptmt.setString(2, password);
			rs = ptmt.executeQuery();
			if (rs.next()) {
				usuario = new Usuario();
				usuario.setLogin(rs.getString(1));
				usuario.setPassword(rs.getString(2));
				usuario.setUserid(rs.getInt(3));
				usuario.setNome(rs.getString(4));
				usuario.setEmail(rs.getString(5));
				usuario.setTelefone(rs.getString(6));
				usuario.setTipo(rs.getString(7));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (ptmt != null)
					ptmt.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return usuario;
	}

	public int insert(Usuario usuario) {
		int userid = 0;

		try {
			Connection conn = getConnection();
			if (conn != null) {
				String querystring = "INSERT INTO usuario (username, password, nome, email, telefone, tipo) VALUES (?,?,?,?,?,?)";
				ptmt = conn.prepareStatement(querystring);
				// boolean insert = executePreparedStatementUpdate(conn,
				// SELECT_USER_INSERT , new String[] { usuario.getLogin(),
				// usuario.getPassword(),
				// usuario.getNome(), usuario.getEmail(), usuario.getTelefone()}
				// );

				ptmt.setString(1, usuario.getLogin());
				ptmt.setString(2, usuario.getPassword());
				ptmt.setString(3, usuario.getNome());
				ptmt.setString(4, usuario.getEmail());
				ptmt.setString(5, usuario.getTelefone());
				ptmt.setString(6, usuario.getTipo());
				int insert = ptmt.executeUpdate();

				if (insert == 1) {

					String select = "SELECT * FROM usuario WHERE username=?";
					ptmt = conn.prepareStatement(select);
					ptmt.setString(1, usuario.getLogin());
					rs = ptmt.executeQuery();
					if (rs.next()) {
						userid = rs.getInt(3);
					}

					rs.close();
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return userid;
	}

	public void add(Paciente paciente) {

		try {
			String querystring = "INSERT INTO EMPLOYEE VALUES(?,?,?,?,?)";
			con = getConnection();
			ptmt = con.prepareStatement(querystring);
			/*
			 * ptmt.setString(1, String.valueOf(System.currentTimeMillis()));
			 * ptmt.setString(2, paciente.getEmpName()); ptmt.setString(3,
			 * paciente.getEmpAddr()); ptmt.setString(4,
			 * paciente.getEmpEmail()); ptmt.setString(5,
			 * paciente.getEmpPhone());
			 */
			ptmt.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (ptmt != null)
					ptmt.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}

		}

	}

	public void update(Usuario usuario) {

		try {
			String querystring = "UPDATE usuario SET username=?,password=?,"
					+ "nome=?,email=?, telefone=? WHERE userid=?";
			con = getConnection();
			ptmt = con.prepareStatement(querystring);

			ptmt.setString(1, usuario.getLogin());
			ptmt.setString(2, usuario.getPassword());
			ptmt.setString(3, usuario.getNome());
			ptmt.setString(4, usuario.getEmail());
			ptmt.setString(5, usuario.getTelefone());
			ptmt.setInt(6, usuario.getUserid());

			ptmt.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (ptmt != null)
					ptmt.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}

		}

	}

	public void delete(String employeeId) {

		try {
			String querystring = "DELETE FROM EMPLOYEE WHERE EMPID=?";
			con = getConnection();
			ptmt = con.prepareStatement(querystring);
			ptmt.setString(1, employeeId);
			ptmt.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (ptmt != null)
					ptmt.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}

		}

	}

	public List<Paciente> findAll() {
		List<Paciente> pacientes = new ArrayList<Paciente>();
		Paciente paciente = null;
		try {
			String querystring = "SELECT * FROM EMPLOYEE";
			con = getConnection();
			ptmt = con.prepareStatement(querystring);
			rs = ptmt.executeQuery();
			while (rs.next()) {
				paciente = new Paciente();
				/*
				 * employeeBean.setEmpId(rs.getString(1)); Trocar por paciente
				 * employeeBean.setEmpName(rs.getString(2));
				 * employeeBean.setEmpAddr(rs.getString(3));
				 * employeeBean.setEmpEmail(rs.getString(4));
				 * employeeBean.setEmpPhone(rs.getString(5));
				 */

				pacientes.add(paciente);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (ptmt != null)
					ptmt.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}

		}
		return pacientes;
	}

	public Paciente findByPrimaryKey(String empId) {

		Paciente paciente = null;
		try {
			String querystring = "SELECT * FROM EMPLOYEE WHERE EMP_ID=?";
			con = getConnection();
			ptmt = con.prepareStatement(querystring);
			ptmt.setString(1, empId);
			rs = ptmt.executeQuery();
			if (rs.next()) {
				/*
				 * employeeBean=new EmployeeBean(); trocar por paciente
				 * employeeBean.setEmpId(rs.getString(1));
				 * employeeBean.setEmpName(rs.getString(2));
				 * employeeBean.setEmpAddr(rs.getString(3));
				 * employeeBean.setEmpEmail(rs.getString(4));
				 * employeeBean.setEmpPhone(rs.getString(5));
				 */
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (ptmt != null)
					ptmt.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}

		}
		return paciente;
	}

	public static void main(String[] args) {

		PacienteDAO employeeDAO = new PacienteDAO();
		System.out.println(employeeDAO.findAll().size());
	}
}